/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * $Id$ CatalogoBean.java
 * Universidad de los Andes (Bogotá - Colombia)
 * Departamento de Ingeniería de Sistemas y Computación
 * Licenciado bajo el esquema Academic Free License version 2.1
 *
 * Ejercicio: Muebles los Alpes
 * Autor: Camilo Alvarez
 * Autor: David Méndez
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
package com.losalpes.catalogo.beans;

import com.losalpes.catalogo.entities.ItemCarrito;
import com.losalpes.catalogo.excepciones.InvalidDataException;
import com.losalpes.catalogo.servicios.*;
import com.losalpes.catalogo.entities.Mueble;
import com.losalpes.catalogo.entities.TipoMueble;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 * Clase que modela el backing bean del catalogo de la tienda
 * @author Camilo Alvarez
 * @author David Méndez
 */
public class CatalogBean {

    // ----------------------------------------------
    // Atributos
    // ----------------------------------------------
    private Long id;
    /**
     * Mueble actual del catalogo.
     */
    private Mueble mueble = new Mueble();

    /**
     * Relación con la interfaz que provee los servicios necesarios del catalogo para el sistema.
     */
    @EJB
    private ICatalogServiceLocal catalogService;

    /**
     * Mensaje utilizado para mostrar información importante al administrador.
     */
    private String mensaje;

    private ItemCarrito item;


    // ----------------------------------------------
    // Constructor
    // ----------------------------------------------
    /**
     * Constructor de la clase. Inicializa los atributos.
     */
    public CatalogBean() {
    }

    // ----------------------------------------------
    // Métodos
    // ----------------------------------------------
    /**
     * Retorna el mueble actual del catalogo.
     * @return mueble. Mueble actual del catalogo.
     */
    public Mueble getMueble() {
        return mueble;
    }

    /**
     * Permite asignar un nuevo valor al mueble actual del catalogo.
     * @param cMueble. Nuevo mueble actual.
     */
    public void setMueble(Mueble cMueble) {
        this.mueble = cMueble;
    }

    /**
     * Retorna la lista de muebles que contiene el catalogo.
     * @return muebles. Lista de muebles que contiene el catalogo.
     */
    public List getMuebles(){
        return catalogService.findAll();
    }

    /**
     * Retorna la lista con los items que contienen los tipos de muebles contenidos en el catalogo.
     * @return tipo. Tipos de muebles contenidos en el catalogo.
     */
    public SelectItem[] getTiposMuebles() {
        TipoMueble[] tipos = TipoMueble.values();
        SelectItem[] sitems = new SelectItem[tipos.length];
        for (int i = 0; i < sitems.length; i++) {
            sitems[i] = new SelectItem(tipos[i]);
        }
        return sitems;
    }

    /**
     * Agrega el mueble actual al catalogo.
     * @return respuesta de la accion.
     */
    public String add() {
        /*catalogService.add(mueble);
        mueble = new Mueble();*/
        return null;
    }

    /**
     * Crea un nuevo mueble para agregar al sistema.
     * @return
     */
    public String newMueble() {
        mueble = catalogService.newMueble();
        return null;
    }

    /**
     * Borra del sistema al mueble seleccionado.
     * @return
     */
    public String delete() {
        Mueble m = catalogService.findByIdentificacion(id);
        catalogService.setMueble(m);
        catalogService.delete();
        destroyBean();
        return null;
    }

    /**
     * Asigna el mueble seleccionado para ser editado.
     * @return
     */
    public String findById() {
        mueble = catalogService.findByIdentificacion(id);
        System.out.print("Mueble: " + mueble.getReferencia());
        return null;
    }

    /**
     * Retorna el id del mueble que esta siendo editado.
     * @return
     */
    public Long getId() {
        return id;
    }

    /**
     * Crea o actualiza el mueble que está seleccionado.
     * @return
     */
    public String createOrUpdate() {
        mensaje = "";
        catalogService.setMueble(mueble);
        try {
            mueble = catalogService.createOrUpdate();
        } catch (InvalidDataException ex) {
            mensaje = ex.getMessage();
        }
        return null;
    }

    /**
     * Asigna el id del mueble seleccionado para edición.
     * @param id
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * Retorna el mensaje que contiene información importante para el administrador.
     * @return
     */
    public String getMensaje() {
        return mensaje;
    }

    /**
     * Asigna el mensaje que serà mostrado al usuario.
     * @param mensaje
     */
    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    /**
     * Elimina la instancia actual del bean.
     */
    public void destroyBean() {
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("CatalogBean");
    }

    public String alCarrito() {
        findById();
        item = new ItemCarrito();
        item.setCantidad(1);
        item.setMueble(mueble);
        return "alCarrito";
    }

    public ItemCarrito getItem() {
        return item;
    }
}